home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 050 / tpstuff2.arc / THELP.PAS < prev   
Pascal/Delphi Source File  |  1985-10-23  |  21KB  |  272 lines

  1. { Program THELP was written by a Mr. Glenn Wood of the Greenville PC Club of
  2. Greenville, Texas.  Mr. Wood learned the principles demonstrated in this
  3. program in a class taught by Mr. Stephen R. Davis, also of Greenville.
  4.   One suggestion for a way to improve this program can be inferred from Mr.
  5. Davis's own comment about the program in a letter he wrote to Borland
  6. International: "Note that the window opening is slow because in our class we
  7. insisted on using the BIOS interrupt rather than go directly to screen memory
  8. ourselves."                                                              }
  9.  
  10. PROGRAM THELP;
  11.  
  12. {$C-}
  13. {$K-}
  14.  
  15.  
  16. {VARIABLE SECTION FOR 'THELP'}
  17.  
  18. type
  19.   text80          = string[80];
  20.   RegType         = record
  21.                       ax,bx,cx,dx,bp,si,di,ds,es,flags:integer
  22.                     end;
  23.   HalfRegType     = record
  24.                       al,ah,bl,bh,cl,ch,dl,dh:byte
  25.                     end;
  26.   IntrType        = record
  27.                       ip,cs : integer
  28.                     end;
  29.  
  30. const
  31.   EntryChar       = 19;                { ALT 'R' }
  32.   Escape          = 0;
  33.   FirstRow        = 3;
  34.   FirstCol        = 11;
  35.   WindowWidth     = 60;
  36.   WindowLength    = 18;
  37.   Dr              = 3;
  38.   Mr              = 12;
  39.   Cr              = $0D;
  40.   UserInt         = $66;
  41.   KybdInt         = $16;
  42.   ProgSize : integer = $A000;             { approx. program size }
  43.  
  44.   Regs    : regtype = (ax:0;bx:0;cx:0;dx:0;bp:0;si:0;di:0;ds:0;es:0;flags:0);
  45.   SaveDS  :integer  = 0;
  46.  
  47. var
  48.   SaveReg    : RegType;
  49.   SaveHalf   : HalfRegType absolute SaveReg;
  50.   HalfReg    : HalfRegType absolute regs;
  51.   i,j,x,y    : integer;
  52.   CursorPos  : integer;
  53.   Selection  : integer;
  54.   savebuf    : array[1..windowwidth] of array[1..windowlength] of integer;
  55.  
  56.  
  57. { MISC. PROCEDURES AND FUNTIONS FOR THELP }
  58.  
  59. procedure Bright(line:text80);
  60. begin
  61.   textcolor(15);
  62.   write(line);
  63.   textcolor(7);
  64. end;
  65.  
  66. procedure PrintHeading;
  67. begin
  68.   bright('T');       write('URBO Pascal ');
  69.   bright('Help   ');  write('Ver 2.0');
  70. end;
  71.  
  72. procedure PrintMCS;
  73. begin
  74.   bright('M'); write('agnum ');
  75.   bright('C'); write('ustom ');
  76.   bright('S'); write('oftware');
  77. end;
  78.  
  79. procedure Border;
  80. begin
  81.    GotoXY(1,1);                              {clear the window now}
  82.    Write(chr(218));
  83.    for i:=2 to windowwidth-1 do Write(chr(196));
  84.    Write(chr(191));
  85.    for i:=2 to windowlength-1 do
  86.    begin
  87.       GotoXY(1, i);  Write(chr(179));
  88.       for j := 2 to windowwidth-1 do
  89.          Write(' ');
  90.       GotoXY(windowwidth, i);  Write(chr(179));
  91.    end;
  92.    GotoXY(1, windowlength);
  93.    Write(chr(192));
  94.    for i:=2 to windowwidth-1 do Write(chr(196));
  95.    Write(chr(217));
  96. END;
  97.  
  98. function GetScreenChar:integer;
  99. begin
  100.    savereg.ax := $0800;                 {9 -> get character/attr @ cursor}
  101.    savereg.bx := 0;
  102.    Intr($10,savereg);
  103.    GetScreenChar := savereg.ax
  104. end;
  105.  
  106. procedure PutScreenChar(input:integer);
  107. begin
  108.    savereg.ax := $0900 + (input and $FF); {a -> put character/attr @ cursor}
  109.    savereg.bx := input shr 8;          {put the attrib in bl and 0 in bh}
  110.    savereg.cx := 1;
  111.    Intr($10,savereg)
  112. end;
  113.  
  114. procedure OpenWindow;
  115. begin
  116.   window (firstcol, firstrow, firstcol+windowwidth, firstrow+windowlength);
  117.     for j := 1 to windowlength do
  118.       for i := 1 to windowwidth do
  119.       begin
  120.          GoToXY(i,j);
  121.          savebuf[i][j] := GetScreenChar      {get a attribute/character at the cursor}
  122.       end;
  123.    border;
  124.   window (firstcol+1,firstrow+1,firstcol+windowwidth-2,firstrow+windowlength-2);
  125.   gotoxy(1,1);
  126. end;
  127.  
  128. procedure closewindow;
  129. begin
  130.   window (firstcol, firstrow, firstcol+windowwidth, firstrow+windowlength);
  131.   for j := 1 to windowlength do
  132.     for i := 1 to windowwidth do
  133.       begin
  134.          GoToXY(i,j);
  135.          PutScreenChar(savebuf[i][j])
  136.       end
  137. end;
  138.  
  139.  
  140. { MENU PRINT PROCEDURES FOR THELP }
  141.  
  142. procedure PrintMenu(number:integer);
  143. begin
  144.   case number of
  145.     0  : begin
  146.            gotoxy(mr+3,2);   PrintHeading;
  147.            gotoxy(mr+7,3);   PrintMCS;
  148.            gotoxy(mr+12,5);  write('MAIN MENU');
  149.            gotoxy(mr,6);   write('<1> Edit Commands');
  150.            gotoxy(mr,7);   write('<2> Syntax Structure');
  151.            gotoxy(mr,8);   write('<3> Standard Procedures/Functions');
  152.            gotoxy(mr,9);   write('<4> Compiler Directives');
  153.            gotoxy(mr,10);  write('<5> Runtime Errors');
  154.            gotoxy(mr,11);  write('<6> I/O Errors');
  155.            gotoxy(mr,12);  write('<7> Standard Identifiers');
  156.            gotoxy(mr,13);  write('<8> Version 2 Additions Part I');
  157.            gotoxy(mr,14);  write('<9> Version 2 Additions Part II');
  158.          end;
  159.     1  : begin
  160.            gotoxy(mr+3,2);   PrintHeading;
  161.            gotoxy(mr+7,3);   PrintMCS;
  162.            gotoxy(mr+7,5);   write('EDITOR COMMANDS MENU');
  163.            gotoxy(mr,7);   write('<1> Cursor Movements Part I');
  164.            gotoxy(mr,8);   write('<2> Cursor Movements Part II');
  165.            gotoxy(mr,9);   write('<3> Insert and Delete Commands');
  166.            gotoxy(mr,10);  write('<4> Block Commands');
  167.            gotoxy(mr,11);  write('<5> Miscellaneous and Options');
  168.          end;
  169.  
  170.     2  : begin
  171.            gotoxy(mr+3,2);   PrintHeading;
  172.            gotoxy(mr+7,3);   PrintMCS;
  173.            gotoxy(mr+6,5);   write('SYNTAX STRUCTURE MENU');
  174.            gotoxy(mr,6);   write('<1> TYPE');
  175.            gotoxy(mr,7);   write('<2> CONST');
  176.            gotoxy(mr,8);   write('<3> VAR');
  177.            gotoxy(mr,9);   write('<4> WITH DO and CASE');
  178.            gotoxy(mr,10);  write('<5> REPEAT UNTIL and WHILE DO');
  179.            gotoxy(mr,11);  write('<6> IF THEN ELSE and FOR TO DO');
  180.            gotoxy(mr,12);  write('<7> PROGRAM, PROCEDURE and FUNCTION');
  181.            gotoxy(mr,13);  write('<8> Program Structure');
  182.          end;
  183.  
  184.     3  : begin
  185.            gotoxy(mr+3,2);   PrintHeading;
  186.            gotoxy(mr+7,3);   PrintMCS;
  187.            gotoxy(mr,5);   write('STANDARD PROCEDURES/FUNCTIONS MENU');
  188.            gotoxy(mr,6);   write('<1> Input/Output Procedures');
  189.            gotoxy(mr,7);   write('<2> Arithmetic Functions');
  190.            gotoxy(mr,8);   write('<3> Scalar Functions/Heap Control');
  191.            gotoxy(mr,9);   write('<4> String Procedures and Functions');
  192.            gotoxy(mr,10);  write('<5> File Handling Procedures');
  193.            gotoxy(mr,11);  write('<6> File Handling Functions');
  194.            gotoxy(mr,12);  write('<7> Transfer/Screen Procs & Funcs');
  195.            gotoxy(mr,13);  write('<8> Miscellaneous Proc/Func Part I');
  196.            gotoxy(mr,14);  write('<9> Miscellaneous Functions Part II');
  197.          end;
  198.   end;
  199.   repeat
  200.     gotoxy(19,15);  write('Enter Selection  ? ');
  201.     savereg.ax := $00;
  202.     Intr(userint,savereg);
  203.     selection := savehalf.ah - 1;
  204.   until ((selection in [0..9]) and (number in [0,3]))
  205.      or ((selection in [0..5]) and (number = 1))
  206.      or ((selection in [0..8]) and (number = 2));
  207.   clrscr;
  208. end;
  209.  
  210.  
  211. procedure Wait;
  212. begin
  213.   gotoxy(14,16); write('PRESS <ESC> TO RETURN TO MENU');
  214.   repeat
  215.     savereg.ax := 0;
  216.     Intr(userint,savereg);
  217.   until savehalf.ah = $01;
  218.   clrscr;
  219. end;
  220.  
  221. procedure CursorMoveI;
  222. begin
  223.   gotoxy(dr,2);   write('CURSOR MOVEMENTS  Part I :');
  224.   gotoxy(dr,4);   write('  Character left         Ctrl-S  ->   ',#$1B);
  225.   gotoxy(dr,5);   write('    Alternative          Ctrl-H  ->  ');
  226.   gotoxy(dr,6);   write('  Character right        Ctrl-D  ->   ',#$1A);
  227.   gotoxy(dr,7);   write('  Word left              Ctrl-A  ->  Ctrl ',#$1B);
  228.   gotoxy(dr,8);   write('  Word right             Ctrl-F  ->  Ctrl ',#$1A);
  229.   gotoxy(dr,9);   write('  Line up                Ctrl-E  ->   ',#$18);
  230.   gotoxy(dr,10);  write('  Line down              Ctrl-X  ->   ',#$19);
  231.   gotoxy(dr,11);  write('  Scroll up              Ctrl-W  ->  ');
  232.   gotoxy(dr,12);  write('  Scroll down            Ctrl-Z  ->  ');
  233.   gotoxy(dr,13);  write('  Page up                Ctrl-R  ->  PgUp');
  234.   gotoxy(dr,14);  write('  Page down              Ctrl-C  ->  PgDn');
  235.   Wait;
  236. end;
  237.  
  238. procedure CursorMoveII;
  239. begin
  240.   gotoxy(dr,2);   write('CURSOR MOVEMENTS  Part II :');
  241.   gotoxy(dr,4);   write('  To left on line      Ctrl-Q Ctrl-S  ->  Home');
  242.   gotoxy(dr,5);   write('  To right on line     Ctrl-Q Ctrl-D  ->  End');
  243.   gotoxy(dr,6);   write('  To top of page       Ctrl-Q Ctrl-E  ->  Ctrl Home');
  244.   gotoxy(dr,7);   write('  To bottom of page    Ctrl-Q Ctrl-X  ->  Ctrl End');
  245.   gotoxy(dr,8);   write('  To top of file       Ctrl-Q Ctrl-R  ->  Ctrl PgUp');
  246.   gotoxy(dr,9);   write('  To end of file       Ctrl-Q Ctrl-C  ->  Ctrl PgDn');
  247.   gotoxy(dr,10);  write('  To top of block      Ctrl-Q Ctrl-B  ->  ');
  248.   gotoxy(dr,11);  write('  To end of block      Ctrl-Q Ctrl-K  ->  ');
  249.   gotoxy(dr,12);  write('  To last cur.pos.     Ctrl-Q Ctrl-P  ->  ');
  250.   Wait;
  251. end;
  252.  
  253. procedure InsertDelete;
  254. begin
  255.   gotoxy(dr,2);   write('INSERT and DELETE :');
  256.   gotoxy(dr,4);   write('  Insert mode on/off     Ctrl-V         ->  Ins');
  257.   gotoxy(dr,5);   write('  Insert line            Ctrl-N         ->  ');
  258.   gotoxy(dr,6);   write('  Delete line            Ctrl-Y         ->  ');
  259.   gotoxy(dr,7);   write('  Del to end of line     Ctrl-Q Ctrl-Y  ->  ');
  260.   gotoxy(dr,8);   write('  Delete right word      Ctrl-T         ->  ');
  261.   gotoxy(dr,9);   write('  Del char under cursor  Ctrl-G         ->  Del');
  262.   gotoxy(dr,10);  write('  Delete left character  <DEL>          ->  ');
  263.   gotoxy(dr,11);  write('    Alternative          nothing        ->  ');
  264.   Wait;
  265. end;
  266.  
  267. procedure BlockCommands;
  268. begin
  269.   gotoxy(dr,2);   write('BLOCK COMMANDS :');
  270.   gotoxy(dr,4);   write('  Mark block begin       Ctrl-K Ctrl-B  ->  F7');
  271.   gotoxy(dr,5);   write('  Mark block end         Ctrl-K Ctrl-K  ->  F8');
  272.   gotoxy(dr,6);   write('  Mark single word       CON